Iphone sdk: résoudre [uinavigationcontroller pushviewcontroller:] sélecteur non reconnu envoyé à l`instance

Video: Popping UIViewController on #Swift, push and pop #UIViewController

J`adore le codage du SDK iPhone. Il est le codage le plus joyeux que je l`ai fait dans le quart de siècle (gasp!) J`ai passé de codage différents systèmes informatiques. Il est une combinaison de Objective-C (élégant) et du cacao (belle). Il y a une exception que je continue à recevoir et juste assez souvent que j`oublie pourquoi je l`obtiens. Je pensais que quelqu`un pourrait profiter de ce parce qu`il est un piège facile à tomber.

L`exception en question:

Video: iPhone Development Tutorial - TableView #4

*** Mettre fin à l`application du fait exception uncaught `NSInvalidArgumentException`, raison: `*** - [UINavigationController pushViewController:]: sélecteur non reconnu envoyé à l`instance 0x5255c0`

Si vous utilisez le modèle d`application basés sur la navigation lors de la création d`un nouveau projet, vous obtenez un ensemble de fichiers de projet qui vous obtient un bon bout de chemin vers une application fonctionnelle. En fait, vous pouvez frapper construire et aller l`application va compiler, exécuter et vous montrer une jolie vue de la table. Vous aurez probablement ensuite ajouter du code pour rendre la vue du tableau d`affichage des choses dans les cellules, l`essai le long du chemin, et il va travailler. À un certain moment, vous voudrez peut-être faire des touches sur les cellules ouvrir une nouvelle vue. Le modèle fournit un exemple méthode « didSelectRowAtIndexPath » montré ici:

- (Void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) {indexPath
// logique de navigation peut aller ici. Créer et pousser un autre contrôleur de vue.
// AnotherViewController * anotherViewController = [[AnotherViewController alloc] initWithNibName: @"Une autre vue" bundle: nil] -
// [self.navigationController pushViewController: anotherViewController] -
// [Communiqué anotherViewController] -
}

La méthode elle-même n`a pas commenté, mais toutes les instructions qu`il contient sont. Ces lignes fournissent un indice de commentaires sur ce qui devrait se produire. La ligne

[Self.navigationController pushViewController: anotherViewController] -

est la clé à la fois le fonctionnement de ce procédé et la cause de l`erreur. Il pousse un nouveau contrôleur de vue sur la pile de navigation et l`affiche, exactement ce que vous voulez qu`il fasse. Toutefois, si vous supprimez cette ligne et l`ajuster à utiliser le nouveau contrôleur de vue que vous avez créé, vous obtenez un avertissement lorsque vous construisez: "avertissement: « UINavigationController » ne peut pas répondre à -pushViewController:" Mais, bien , ceci est un avertissement, pas une erreur. Peuh. Lancez-le, cependant, et vous obtiendrez l`erreur indiqué ci-dessus, et le sélecteur non reconnu envoyé à une instance.

Video: Introduction to iOS, by Rhed Shi

Si ce que vous avez lu beaucoup semble familier, la solution probable est simple. La ligne ci-dessus à partir du modèle fourni par Apple est faux. Il est en fait pas une signature de message pour UINaigationController appelé -pushViewController: mais il y a un appelé -pushViewController: animé: - Oops! Désolé Apple! Nous aimons toujours vous, cependant. Très facile à corriger, mais si cela arrive après une longue journée de codage, il peut causer de la frustration excessive. La ligne corrigée devrait ressembler à:

[Self.navigationController pushViewController: anotherViewController animé: OUI] -

Reconstruire et cette erreur sera résolu! Si tel était votre problème. Si ce n`était pas, alors ne désespérez pas. Décryptage des messages d`exception fait partie de la partie amusante du style de vie coderdom. Un « sélecteur non reconnu » va toujours se référer au message que vous envoyez « à l`instance, » un objet que vous avez créé. L`exception nous dit même quelle classe de l`objet qui reçoit le message bizarre (UINavigationController dans ce cas) et le message qui a été envoyé (pushViewController :). Dans ce cas, le compilateur savait qu`il y avait quelque chose dégueulasses sur le message envoyé, mais il ne peut pas toujours être en mesure de déterminer, de sorte que vous ne pouvez pas compter sur elle. Cependant, vous devriez être en mesure de rechercher votre code pour le message indiqué à l`exception du journal de la console. Assurez-vous que tout est bon dans cette ligne de vérification dans la documentation de la nature exacte de l`appel.

Articles connexes